package com.pj.project.sys_user_sync.listen;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.pj.project.sys_user.SysUser;
import com.pj.project.sys_user.SysUserMapper;
import com.pj.project.sys_user.SysUserService;
import com.pj.project.sys_user_password.SysUserPasswordService;
import com.pj.project4sp.config.SpConfigUtil;
import com.pj.utils.so.SoMap;

import cn.dev33.satoken.util.SaResult;
import lombok.extern.slf4j.Slf4j;

/**
 * 收听从其它客户端推送来的 User 信息 
 *
 * @author click33
 * @since 2022/11/22
 */
@Slf4j
@RestController
public class SspServerListenController {

    /*
     * 同步成功的情况下，返回：
     * {
     *      code: 200,
     *      msg: "ok"
     * }
     * 同步失败的情况下，返回：
     * {
     *      code: 500,
     *      msg: "xxx"  // 失败原因
     * }
     */

	/** 底层 Mapper 对象 */
	@Autowired
	SysUserMapper sysUserMapper;

	@Autowired
	SysUserService sysUserService;

	@Autowired
	SysUserPasswordService sysUserPasswordService;

    // 收到通知：增加用户
    @RequestMapping("/ssp/listen/user/add")
    public SaResult userAdd(HttpServletRequest request) {
        log.info("-------- 收到推送: user/add");

		// 如果尚未打开接受推送配置，则直接退出 
		if(SpConfigUtil.isListen() == false) {
			return SaResult.error("当前系统暂未开启全局推送");
		}

        // 解析数据 
        SoMap dataMap = SspServerListenUtil.getData(request);
        SysUser user = dataMap.getModel(SysUser.class);
        sysUserService.add(user);

        // 回复推送方
        return SaResult.ok();
    }

    // 收到通知：删除用户
    @RequestMapping("/ssp/listen/user/delete")
    public SaResult userDelete(HttpServletRequest request) {
    	log.info("-------- 收到推送: user/delete");

		// 如果尚未打开接受推送配置，则直接退出 
		if(SpConfigUtil.isListen() == false) {
			return SaResult.error("当前系统暂未开启全局推送");
		}

        // 解析数据 
    	SoMap dataMap = SspServerListenUtil.getData(request);
    	long id = dataMap.getLong("id");
    	sysUserService.delete(id);

        // 回复推送方
        return SaResult.ok();
    }

    // 收到通知：修改用户
    @RequestMapping("/ssp/listen/user/update")
    public SaResult userUpdate(HttpServletRequest request) {
    	log.info("-------- 收到推送: user/update");

		// 如果尚未打开接受推送配置，则直接退出 
		if(SpConfigUtil.isListen() == false) {
			return SaResult.error("当前系统暂未开启全局推送");
		}

    	// 解析数据 
    	SoMap dataMap = SspServerListenUtil.getData(request);
    	SysUser user = dataMap.getModel(SysUser.class);
    	sysUserService.update(user);

        // 回复推送方
        return SaResult.ok();
    }

    // 收到通知：修改用户密码
    @RequestMapping("/ssp/listen/user/updatePassword")
    public SaResult userUpdatePassword(HttpServletRequest request) {
    	log.info("-------- 收到推送: user/updatePassword");

		// 如果尚未打开接受推送配置，则直接退出 
		if(SpConfigUtil.isListen() == false) {
			return SaResult.error("当前系统暂未开启全局推送");
		}

        // 解析数据 
    	SoMap dataMap = SspServerListenUtil.getData(request);
    	long id = dataMap.getLong("id");
    	String password = dataMap.getString("password");
    	sysUserPasswordService.updatePassword(id, password, false);

        // 回复推送方
        return SaResult.ok();
    }

    // 收到通知：查询用户
    @RequestMapping("/ssp/listen/user/get")
    public SaResult userGet(HttpServletRequest request) {
    	log.info("-------- 收到推送: user/get");

		// 如果尚未打开接受推送配置，则直接退出 
		if(SpConfigUtil.isListen() == false) {
			return SaResult.error("当前系统暂未开启全局推送");
		}

        // 解析数据 
    	SoMap dataMap = SspServerListenUtil.getData(request);
    	long id = dataMap.getLong("id");
    	
    	// 查询用户信息并回复 
    	SysUser user = sysUserMapper.getById(id);
    	SoMap so = SoMap.getSoMap()
    			.setModel(user)
    			.set("passwrod", sysUserMapper.getPwById(id));

        // 回复推送方
        return SaResult.data(so);
    }

}